package ksv.cron.v1.impl;

import api.common.bean.SysLog;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import ksv.cron.CronContext;
import ksv.cron.CronCst;
import ksv.cron.CronModel;
import ksv.cron.bean.SysCron;
import ksv.cron.bean.SysCronLog;
import ksv.cron.v1.CronCallback;
import ksv.cron.v1.CronCallbackPostProcessor;
import ksv.cron.v1.ICron;
import mybatis.mapper.CronLogMapper;
import mybatis.mapper.CronMapper;
import org.springframework.core.annotation.Order;

import javax.annotation.Resource;

/**
 * @创建人 wsdc
 * @时间 2021/2/1
 * @描述 $
 */
@Order(0)
public class DefaultCronCallbackPostProcessor implements CronCallbackPostProcessor {
    @Resource
    CronMapper cronMapper;

    @Resource
    CronLogMapper cronLogMapper;

    @Override
    public void beforeCall(CronContext context, CronCallback callback) throws Exception {
        boolean check = check(context);
        if (!check) {
            //  如果检测已经是 无效的定时任务了 可以over了
            context.setShouldContinue(false);
            return;
        }
    }

    @Override
    public void afterCall(CronContext context, CronCallback callback, CronModel.R result) throws Exception {
        //  保存一条调用日志
        SysCronLog log = result == null ? log(context) : log(context,result);
        cronLogMapper.insert(log);
    }

    private SysCronLog log(CronContext context) {
        SysCronLog log0 = new SysCronLog();
        log0.setCronId(context.getICron().sysCron().getId());
        log0.setLogKey(context.getUniqueKey());
        log0.setStatus("N");
        return log0;
    }

    private SysCronLog log(CronContext context, CronModel.R r) {
        SysCronLog log0 = new SysCronLog();
        log0.setCronId(context.getICron().sysCron().getId());
        log0.setLogKey(context.getUniqueKey());
        log0.setResultMap(((JSONObject) JSON.toJSON(r)));
        log0.setStatus("N");
        return log0;
    }

    public boolean check(CronContext context) {
        ICron iCron = context.getICron();
        //  直接通过
        if(!iCron.shouldCheck()){
            return true;
        }

        SysCron sysCron = iCron.sysCron();
        //  已经标记为删除
        if(sysCron.isRemove()){
            return false;
        }

        SysCron dbCron = cronMapper.selectById(sysCron.getId());

        if (dbCron == null) {
            //  已经删除了
            context.setTaskDelete(true);
            sysCron.setRemove(true);
            return false;
        }

        if (dbCron.getStatus() == CronCst.Status.COMPLETE) {
            //  已经完成了
            context.setTaskComplete(true);
            sysCron.setRemove(true);
            return false;
        }

        if (dbCron.getStatus() == CronCst.Status.DISABLED) {
            //  停止工作了
            context.setTaskDisabled(true);
            sysCron.setRemove(true);
            return false;
        }

        return true;
    }
}
